package com.ruoyi.service.impl;

import java.util.Date;
import java.util.List;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional;
import com.ruoyi.mapper.MobilUserCouponMapper;
import com.ruoyi.mapper.MobileCouponMapper;
import com.ruoyi.domain.MobileUserCoupon;
import com.ruoyi.domain.MobileCoupon;
import com.ruoyi.service.IMobileUserCouponService;

/**
 * 用户优惠券Service业务层处理
 * 
 * @author ruoyi
 * @date 2025-01-20
 */
@Service
public class MobileUserCouponServiceImpl implements IMobileUserCouponService 
{
    @Autowired
    private MobilUserCouponMapper mobileUserCouponMapper;

    @Autowired
    private MobileCouponMapper mobileCouponMapper;

    /**
     * 查询用户优惠券
     * 
     * @param id 用户优惠券主键
     * @return 用户优惠券
     */
    @Override
    public MobileUserCoupon selectMobileUserCouponById(Integer id)
    {
        return mobileUserCouponMapper.selectMobilUserCouponById(id);
    }

    /**
     * 查询用户优惠券列表
     * 
     * @param mobileUserCoupon 用户优惠券
     * @return 用户优惠券
     */
    @Override
    public List<MobileUserCoupon> selectMobileUserCouponList(MobileUserCoupon mobileUserCoupon)
    {
        return mobileUserCouponMapper.selectMobilUserCouponList(mobileUserCoupon);
    }

    /**
     * 根据用户ID查询优惠券列表（包含优惠券详细信息）
     * 
     * @param userId 用户ID
     * @return 用户优惠券集合
     */
    @Override
    public List<MobileUserCoupon> selectUserCouponsWithDetails(Integer userId)
    {
        return mobileUserCouponMapper.selectUserCouponsWithDetails(userId);
    }

    /**
     * 根据用户ID查询可用优惠券列表
     * 
     * @param userId 用户ID
     * @return 可用优惠券集合
     */
    @Override
    public List<MobileUserCoupon> selectAvailableUserCoupons(Integer userId)
    {
        return mobileUserCouponMapper.selectAvailableUserCoupons(userId);
    }

    /**
     * 根据用户ID和商家ID查询可用优惠券列表（用于订单页面选择优惠券）
     * 
     * @param userId 用户ID
     * @param merchantId 商家ID
     * @return 可用优惠券集合
     */
    @Override
    public List<MobileUserCoupon> selectAvailableUserCouponsByMerchant(Integer userId, Integer merchantId)
    {
        return mobileUserCouponMapper.selectAvailableUserCouponsByMerchant(userId, merchantId);
    }

    /**
     * 领取优惠券
     * 
     * @param userId 用户ID
     * @param couponId 优惠券ID
     * @return 结果
     */
    @Override
    @Transactional
    public int receiveCoupon(Integer userId, Integer couponId)
    {
        // 检查用户是否已经领取过该优惠券
        MobileUserCoupon existingCoupon = mobileUserCouponMapper.selectUserCouponByCouponId(userId, couponId);
        if (existingCoupon != null) {
            throw new RuntimeException("您已经领取过该优惠券");
        }

        // 检查优惠券是否存在且可领取
        MobileCoupon coupon = mobileCouponMapper.selectMobileCouponById(couponId);
        if (coupon == null) {
            throw new RuntimeException("优惠券不存在");
        }
        
        if (coupon.getStatus() != 0) {
            throw new RuntimeException("优惠券已停止发放");
        }
        
        if (coupon.getSize() >= coupon.getNum()) {
            throw new RuntimeException("优惠券已被领完");
        }

        // 检查优惠券是否在发放时间内
        Date now = new Date();
        if (now.before(coupon.getStart()) || now.after(coupon.getEnd())) {
            throw new RuntimeException("优惠券不在发放时间内");
        }

        // 领取优惠券
        int result = mobileUserCouponMapper.receiveCoupon(userId, couponId);
        
        if (result > 0) {
            // 增加优惠券领取数量
            mobileCouponMapper.increaseCouponSize(couponId);
        }
        
        return result;
    }

    /**
     * 使用优惠券
     * 
     * @param userCouponId 用户优惠券ID
     * @param orderId 订单ID
     * @return 结果
     */
    @Override
    @Transactional
    public int useCoupon(Integer userCouponId, Long orderId)
    {
        // 检查用户优惠券是否存在且可用
        MobileUserCoupon userCoupon = mobileUserCouponMapper.selectMobilUserCouponById(userCouponId);
        if (userCoupon == null) {
            throw new RuntimeException("优惠券不存在");
        }
        
        if (userCoupon.getStatus() != 0) {
            throw new RuntimeException("优惠券已使用或已过期");
        }

        // 更新用户优惠券状态
        userCoupon.setStatus(1); // 设置为已使用
        userCoupon.setUseTime(new Date());
        userCoupon.setOrderId(orderId);
        
        return mobileUserCouponMapper.updateMobilUserCoupon(userCoupon);
    }

    /**
     * 新增用户优惠券
     * 
     * @param mobileUserCoupon 用户优惠券
     * @return 结果
     */
    @Override
    public int insertMobileUserCoupon(MobileUserCoupon mobileUserCoupon)
    {
        return mobileUserCouponMapper.insertMobilUserCoupon(mobileUserCoupon);
    }

    /**
     * 修改用户优惠券
     * 
     * @param mobileUserCoupon 用户优惠券
     * @return 结果
     */
    @Override
    public int updateMobileUserCoupon(MobileUserCoupon mobileUserCoupon)
    {
        return mobileUserCouponMapper.updateMobilUserCoupon(mobileUserCoupon);
    }

    /**
     * 删除用户优惠券信息
     * 
     * @param id 用户优惠券主键
     * @return 结果
     */
    @Override
    public int deleteMobileUserCouponById(Integer id)
    {
        return mobileUserCouponMapper.deleteMobilUserCouponById(id);
    }
}
